package demo923;

import cn.hutool.core.io.FileUtil;
import org.apache.commons.io.FileUtils;

import javax.swing.text.AttributeSet;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class demo4 {
    public static void main(String[] args) throws IOException {
     //爬虫--爬取网络姓氏
       /* 制造假数据：
        获取姓氏：https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
        获取男生名字：http://www.haoming8.cn/baobao/10881.html（但是只有名，没有姓）
        获取女生名字：http://www.haoming8.cn/baobao/7641.html（但是只有名，没有姓）

*/
        //爬取姓氏：
        //姓氏网址
        String nameAddress="https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
        //男孩名网址
        String boyAddress="http://www.haoming8.cn/baobao/10881.html";
        //女孩名网址
        String girlAddress="http://www.haoming8.cn/baobao/7641.html";
        //获取网址上的全部数据
       String familyName=getNetData(nameAddress);
       String boyName=getNetData(boyAddress);
        String girlName=getNetData(girlAddress);
       //创建集合存放已经处理好的男孩，女孩名字
        HashMap<Integer,String> boy=new HashMap<>();
        HashMap<Integer,String> girl=new HashMap<>();
        //创建存放最终姓名的集合
        ArrayList list=new ArrayList();
       //正则表达式
        String RegexFamily="[^\\w&&[^0-9]]{4}(，|。)";
        String RegexBoy="(([\u4e00-\u9fa5·]{2}(、|。)){2})";//柏枝、冠浩、棋润
        String RegexGirl="([\u4e00-\u9fa5·]{2}\\s){4}..";//彤舞 芊静 艾丝 惠蕙 语月
       //剔除不需要的数据，获取只有姓氏的数据--正则表达式
        String AllFamilyName=getFamilyName(familyName,RegexFamily);//获取到的全部姓氏，不带标点
        String AllBoyName=getBoyName(boyName,RegexBoy);
        String AllGirlName=getGirlName(girlName,RegexGirl);
        //这里对男孩的姓名进行处理--》因为多截取了后12对名字
        String BoyName="";
        for (int i = 0; i < AllBoyName.length()-24; i++) {//就是24个字符
            BoyName=BoyName+AllBoyName.charAt(i)+AllBoyName.charAt(++i);
        }
        boy=IsRepeat(BoyName);
        girl=IsRepeat(AllGirlName);
        list=getAllName(AllFamilyName,boy,5);//取出5个男孩名
       list= getAllName(AllFamilyName,boy,5);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }

    }

    //爬取所给网址的全部信息
    public static String getNetData(String nameAddress) throws IOException {
        //创建URL对象
        URL url = new URL(nameAddress);
        //连接这个网络
        URLConnection connection = url.openConnection();
        //从这个网址上获取数据--输入流getInputStream这个方法-->但是这个方法获取的是字节输入流--》获取的数据含中文--》转换流--》字符流
        InputStreamReader reader = new InputStreamReader(connection.getInputStream());//将字节流转为字符流
        int len;
        StringBuilder sb = new StringBuilder();
        while ((len = reader.read()) != -1) {
            sb.append((char) len);//不要用字符串拼接，每拼接一次就相当于创建了一个新的字符串
        }
        reader.close();

        return sb.toString();
    }

    //获取网址中只含有姓氏的数据
    public static String getFamilyName(String familyName,String regexContent){
        //正则表达式
        /*和穆萧尹，姚邵湛汪。
        祁毛禹狄，米贝明臧。*/
        //柏枝、冠浩、棋润
        StringBuilder sb=new StringBuilder();
        String regex=regexContent;//正则表达式--》和穆萧尹，
        Pattern pattern=Pattern.compile(regex);
        Matcher matcher=pattern.matcher(familyName);
        while(matcher.find()){
            String str=matcher.group();
            char separator=str.charAt(4);
            if(separator=='，'){
                sb.append(str.split("，")[0]);
            }
            else if(separator=='。'){
                sb.append(str.split("。")[0]);
            }
            else if(separator=='、'){
                sb.append(str.split("、")[0]);
            }
        }
        return sb.toString();
    }

    //获取网址中只含有男孩名的数据
    public static String getBoyName(String BoyName,String regexContent){
        //正则表达式
        /*和穆萧尹，姚邵湛汪。
        祁毛禹狄，米贝明臧。*/
        //柏枝、冠浩、棋润
        StringBuilder sb=new StringBuilder();
        String regex=regexContent;//正则表达式--》和穆萧尹，
        Pattern pattern=Pattern.compile(regex);
        Matcher matcher=pattern.matcher(BoyName);
        while(matcher.find()){
            String str=matcher.group();
            if(str.charAt(2)=='、'){
                if(str.charAt(5)=='。'){
                    sb.append(str.split("、")[0]);
                    sb.append(str.split("、")[1].split("。")[0]);
                }else{
                    sb.append(str.split("、")[0]);
                    sb.append(str.split("、")[1]);
                }
            }

        }
        return sb.toString();
    }

    //获取网页中只含有女孩名的数据
    public static String getGirlName(String GirlName,String regexContent){
        StringBuilder sb=new StringBuilder();
        String regex=regexContent;//正则表达式--》和穆萧尹，
        Pattern pattern=Pattern.compile(regex);
        Matcher matcher=pattern.matcher(GirlName);
        while(matcher.find()){
            String str=matcher.group();
            //彤舞 芊静 艾丝 惠蕙 语月
            //依莹 瑶馨 曼珍 逸云 微婉
            //彤舞[0]   芊静 艾丝 惠蕙 语月[1]
            //进行拆分
            for (int i = 0; i < 5; i++) {
                sb.append(str.split(" ")[i]);
            }
        }
        return sb.toString();
    }


    //判断男孩名字和女孩名字是否重复
    public static HashMap<Integer,String> IsRepeat(String name){
        //使用hashMap集合可以去重--只需要判断次数即可
        HashMap<Integer,String> hashMap=new HashMap<>();
        //先对字符串进行截取--放到集合中
        for (int i = 0; i < name.length(); i++) {
            String str="";
            if((i)%2==0 ){
                   str= str+name.charAt(i)+name.charAt(i+1);
                   int key=(i+2)/2;
                   hashMap.put(key,str);//0,2,4,6,8
            }
        }
        return hashMap;
    }
    //获取随机的姓名
    public static ArrayList<String> getAllName(String FamilyName,Map<Integer,String> name,int num){
        ArrayList<String> list=new ArrayList<>();
        Random r=new Random();
        for (int i = 0; i < num; i++) {
            int index1=r.nextInt(FamilyName.length());
            int index2=r.nextInt(name.size());
            String family=FamilyName.charAt(index1)+"";//通过键找值
            String BgName=name.get(index2);
            list.add(family+BgName);
        }
        return list;
    }

    //遍历双列集合
    public static void PrintMap(Map<Integer,String> map){
        Set<Map.Entry<Integer,String>> entries=map.entrySet();
        for(Map.Entry<Integer,String> entry:entries){
            Integer key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+","+value);
        }
    }


}
